package com.java.polymorphic;

/**
 * @author Lenl
 * @create 2021-05-30 0:46
 *
 * 1.理解多态性：一个事务的多种形态
 * 2.何为多态性：
 *  对象的多态性：父类的引用指向子类的对象(或子类的对象赋值给父类的引用)
 * 3.多态的使用：虚拟方法调用
 *   有了对象的多态性后，编译期只能调用父类声明的方法，但实际调用的是子类重写的方法
 *   总结：编译看左边，运行看右边
 * 4.多态的使用前提：①类的继承关系 ②方法的重写
 * 5.对象的多态性只适用于方法，不适用于属性，属性看左边
 *
 */
public class PersonTest {
    public static void main(String[] args) {
        Person p1=new Person();
        p1.eat();
        Man man=new Man();
        man.eat();
        man.age=25;
        man.earnMoney();

        //*****************多态性***********//
        System.out.println("************多态性********");
        //对象的多态性。父类的引用指向子类的对象
        Person p2=new Man();
        Person p3=new Woman();
        //多态的使用，当调用子父类同名同参数方法时，实际执行的是子类重写父类的方法---虚拟方法调用
        p2.eat();
        p3.walk();
        //但是只能调用Person中声明过的方法，不能使用 p2.earnMoney()
        //如何调用子类特有方法？


        //********************instanceof********//
        //向下转型
        Man man1=(Man)p2; //强转有风险，如转成Woman，会出现ClassCastException
        man1.earnMoney();
        /*
        * instanceof关键字的使用
        * a instanceof A:判断对象a是否是类A的实例，是true否false
        *
        * 如果a instanceof A返回true，a instanceof B也返回true
        * 其中B是A的父类
        * */
        if(p2 instanceof Woman){
            Woman w1=(Woman)p2;
            w1.goShopping();
        }else if(p2 instanceof  Man){
            Man m1=(Man)p2;
            m1.earnMoney();
        }
    }
}
